#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <stack>
#include <bitset>
#define F first
#define S second
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=2010,M=2*N;
int e[M],ne[M],idx,h[N];
int w[N];
int siz[N];
ll f[N][N][2];
int n;
void init(int n)
{
	for(int i=0;i<=n+1;i++)
	{
		h[i]=-1;
		siz[i]=0;
	}
	for(int i=0;i<=n+1;i++)
	{
		for(int j=0;j<=n+1;j++)
		{
			f[i][j][0]=f[i][j][1]=1e18;
		}
	}
}
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u)
{
	siz[u]++;
	f[u][1][1]=w[u];
	f[u][0][0]=0;
	for(int i=h[u];~i;i=ne[i])
	{
		int t=e[i];
		dfs(t);
		for(int j=siz[u];j>=0;j--)
		{
			for(int k=siz[t];k>=0;k--)
			{
				if(j>=1) f[u][j+k][1]=min({f[u][j+k][1],f[u][j][1]+f[t][k][1]+w[t],f[u][j][1]+f[t][k][0]});
				f[u][j+k][0]=min({f[u][j+k][0],f[u][j][0]+f[t][k][1],f[u][j][0]+f[t][k][0]});
			}
		}
        siz[u]+=siz[t];
	}
	
}
void solve()
{
	cin>>n;
	init(n);
	for(int i=2;i<=n;i++)
	{
		int u;
		cin>>u;
		add(u,i);
	}
	for(int i=1;i<=n;i++)
	{
		cin>>w[i];
	}
	dfs(1);
	for(int i=n;i>=0;i--)
	{
		cout<<min(f[1][i][1],f[1][i][0])<<' '; 
	}
	cout<<'\n';
}
int main()
{
	IOS;
	int T=1;
	cin>>T;

	while(T--)
	{
		solve();
	}

	return 0;
}
